package com.powernode.driver.service.impl;

import com.powernode.driver.properties.TencentProperties;
import com.powernode.driver.service.CiService;
import com.powernode.model.vo.order.TextAuditingVo;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.ciModel.auditing.*;
import com.qcloud.cos.region.Region;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.apache.commons.codec.binary.Base64;

/**
 * 内容审核服务实现类
 * 负责处理腾讯云内容审核相关的业务逻辑，如图片审核等
 */
@Service // Spring服务层注解，标识为服务组件
public class CiServiceImpl implements CiService {
    @Resource
    private TencentProperties tencentProperties; // 腾讯云配置属性，包含密钥、区域等配置信息

    /**
     * 获取腾讯云COS客户端实例
     *
     * @return COSClient对象，用于操作腾讯云对象存储服务
     */
    private COSClient getCOSClient() {
        // 创建腾讯云凭证对象
        COSCredentials cred = new BasicCOSCredentials(tencentProperties.getSecretId(), tencentProperties.getSecretKey());
        // 创建客户端配置对象，设置区域
        ClientConfig clientConfig = new ClientConfig(new Region(tencentProperties.getRegion()));
        // 设置使用HTTPS协议
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 创建并返回COS客户端实例
        COSClient cosClient = new COSClient(cred, clientConfig);
        return cosClient;
    }

    /**
     * 图片内容审核
     * 对存储在腾讯云COS中的图片进行违规内容检测
     *
     * @param path 图片在COS中的路径
     * @return 审核结果，true表示审核通过，false表示审核不通过
     */
    @Override
    public Boolean imageAuditing(String path) {
        // 获取COS客户端实例
        COSClient cosClient = getCOSClient();
        // 创建图片审核请求对象
        ImageAuditingRequest imageAuditingRequest = new ImageAuditingRequest();
        // 设置存储桶名称
        imageAuditingRequest.setBucketName(tencentProperties.getBucketPrivate());
        // 设置要审核的图片对象键
        imageAuditingRequest.setObjectKey(path);
        // 调用腾讯云API进行图片审核
        ImageAuditingResponse imageAuditingResponse = cosClient.imageAuditing(imageAuditingRequest);
        // 关闭COS客户端连接
        cosClient.shutdown();

        // 检查审核结果，包括色情、广告、暴恐、政治敏感内容
        // 任何一项命中则返回false（审核不通过）
        if (!imageAuditingResponse.getPornInfo().getHitFlag().equals("0") // 色情内容检测
                || !imageAuditingResponse.getAdsInfo().getHitFlag().equals("0") // 广告内容检测
                || !imageAuditingResponse.getTerroristInfo().getHitFlag().equals("0") // 暴恐内容检测
                || !imageAuditingResponse.getPoliticsInfo().getHitFlag().equals("0") // 政治敏感内容检测
        ) {
            return false;
        }
        // 所有检测项均未命中，返回true（审核通过）
        return true;
    }

    /**
     * 文本内容审核
     * 对输入的文本内容进行违规内容检测（色情、违法、谩骂等）
     *
     * @param content 待审核的文本内容
     * @return 文本审核结果对象，包含审核结果和违规关键词
     */
    @Override
    public TextAuditingVo textAuditing(String content) {
        // 创建文本审核结果对象，用于存储审核结果
        TextAuditingVo textAuditingVo = new TextAuditingVo();
        // 获取腾讯云COS客户端实例
        COSClient cosClient = getCOSClient();
        // 创建文本审核请求对象
        TextAuditingRequest request = new TextAuditingRequest();
        // 设置存储桶名称
        request.setBucketName(tencentProperties.getBucketPrivate());

        // 将文本内容转换为Base64编码，符合腾讯云API的输入要求
        byte[] bytes = Base64.encodeBase64(content.getBytes());
        String contentBase64 = new String(bytes);
        // 设置审核内容（Base64编码后的文本）
        request.getInput().setContent(contentBase64);
        // 设置检测类型为全部（色情、违法、谩骂等所有类型）
        request.getConf().setDetectType("all");
        // 调用腾讯云API创建文本审核任务并获取响应
        TextAuditingResponse response = cosClient.createAuditingTextJobs(request);
        // 获取审核任务详情
        AuditingJobsDetail detail = response.getJobsDetail();

        // 判断审核任务是否成功完成,equalsIgnoreCase忽略大小写
        if ("success".equalsIgnoreCase(detail.getState())) {
            // 获取审核结果（"0"表示正常，"1"表示违规）
            String result = detail.getResult();
            // 创建字符串缓冲区，用于存储所有违规关键词
            StringBuffer keywords = new StringBuffer();

            // 遍历所有文本段落的审核信息
            for (SectionInfo info : detail.getSectionList()) {
                // 获取各类型违规内容的关键词
                String pornInfoKeyword = info.getPornInfo().getKeywords(); // 色情内容关键词
                String illegalInfoKeyword = info.getIllegalInfo().getKeywords(); // 违法内容关键词
                String abuseInfoKeyword = info.getAbuseInfo().getKeywords(); // 谩骂内容关键词
                // 将存在的违规关键词添加到缓冲区
                if (pornInfoKeyword.length() > 0) {
                    keywords.append(pornInfoKeyword).append(",");
                }
                if (illegalInfoKeyword.length() > 0) {
                    keywords.append(illegalInfoKeyword).append(",");
                }
                if (abuseInfoKeyword.length() > 0) {
                    keywords.append(abuseInfoKeyword).append(",");
                }
            }

            // 设置审核结果和违规关键词到返回对象中
            textAuditingVo.setResult(result);
            textAuditingVo.setKeywords(keywords.toString());
        }
        // 返回文本审核结果
        return textAuditingVo;
    }
}
